package com.youran.restful.webprinter.service;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.youran.restful.webprinter.model.FileInfo;

@Service
public class FileOperater {

	private Logger logger = LoggerFactory.getLogger(FileOperater.class);
	
	/**
	 * 通过二进制上传文档
	 * @param basePath 上传文档的基础目录
	 * @param filename 上传文件的名字
	 * @param sourceFile 原始上传文件的二进制流
	 * @throws IOException 
	 */
	public void uploadFile(String basePath, String filename, InputStream sourceFile) throws IOException {
		String filepath = basePath + filename;
		
		File target = new File(filepath);
		if(target.exists()) {
			logger.info("文档已经存在，本次操作将会覆盖原文档：{}", filepath);
		}
		FileUtils.copyInputStreamToFile(sourceFile, target);
//		showContent(sourceFile);
		
		logger.info("文件上传完成:{}", filepath);
	}
	
	private void showContent(InputStream sourceFile) {
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new InputStreamReader(sourceFile));
			String line = null;
			while((line=reader.readLine()) != null) {
				logger.info(line);
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if(reader!=null) {
				try {
					reader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 查找待打印的文档列表
	 * @param basePath 文档的基础目录
	 * @return
	 */
	public List<FileInfo> findExistFilesById(String basePath) {
		logger.info("查找目录下文件：{}", basePath);
		List<FileInfo> result = new LinkedList<FileInfo>();
		try {
			File parent = new File(basePath);
			File[] docs = parent.listFiles();
			for(File doc : docs) {
				if(doc.isFile()) {
					result.add(new FileInfo(doc));
				}
			}
		} catch(Exception e) {
			logger.error("读取文件异常：{}", e);
		}
		logger.info("目录[{}]下文件列表：{}", basePath, result);
		
		return result;
	}
	
	/**
	 * 删除基础目录下所有文档
	 * @param basePath 文档的基础目录
	 * @return
	 */
	public String deleteBasePath(String basePath) {
		File parent = new File(basePath);
		File[] docs = parent.listFiles();
		StringBuilder message = new StringBuilder("删除文件信息：");
		for(File doc : docs) {
			message.append(doc.getName()).append("|");
			doc.delete();
			logger.info("删除文档：{}", doc.getName());
		}
		parent.delete();
		logger.info("删除临时目录：{}", basePath);
		return message.toString();
	}
	
	/**
	 * 删除文档
	 * @param filepath 文档路径
	 */
	public void delete(String filepath) {
		try {
			File theFile = new File(filepath);
			if(theFile.isFile()) {
				theFile.deleteOnExit();
				logger.info("已成功删除文件：", filepath);
			} else {
				logger.warn("删除异常，此方法只用于文件删除，不删除目录");
			}
			
		} catch(Exception e) {
			logger.error("删除文件异常:{}", e);
		}
	}
	
}
